package com.restkeeper.utils.dic.common;


import com.restkeeper.utils.EnumUtils;
import com.restkeeper.utils.dic.common.convert.annotation.AutoEnum;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;

@Component
public class InterprectChineseUtils<T extends Serializable> {

    /**
     * 通过注解将传入的实体翻译成中文的说明 实体中对应注解@AutoEnum
     * @param list 需要将枚举翻译成中文说明的实体
     */
    public void reflexEnum(List<T> list) {
        for (T t : list) {
            Class clas = t.getClass();
            for (Field f : t.getClass().getDeclaredFields()) {
                Object value = null;
                try {
                    //对于private的属性，如果不解锁，那么将无法访问，会报错
                    f.setAccessible(true);
                    //通过反射的字段获取实体中的值
                    value = f.get(t);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                //获取注解的信息
                AutoEnum anno = f.getAnnotation(AutoEnum.class);
                if(anno!=null && value!=null) {
                    //注解的path
                    String path = anno.path();
                    //注解的fieldName
                    String fieldName = anno.fieldName();
                    //通过value过去枚举中对应的中文说明
                    String enumValues = InterprectChineseUtils.enumExplain(path, value.toString());
                    try {
                        //通过注解中写的fieldName，给需要赋值的字段赋值
                        Field fv  = null;
                        if(!"".equals(fieldName)) {
                            fv = clas.getDeclaredField(fieldName);
                        }
                        else {
                            fv = f;
                        }
                        if(StringUtils.isNotBlank(enumValues)){
                            //对于private的属性，如果不解锁，那么将无法访问，会报错
                            fv.setAccessible(true);
                            fv.set(t,enumValues);
                        }
                    } catch (NoSuchFieldException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

    }


    /**
     * 通过枚举路径跟值获取对应的中文说明
     * @param name 枚举的class路径
     * @param code 对应的枚举值
     * @return
     */
    public static String enumExplain(String name, String code) {
        try {
            Class clazz = Class.forName(name);
            List<Map<String, Object>> list = EnumUtils.toMapList(clazz);
            for (Map map : list) {
                if (map.get("code").toString().equals(code)) {
                    return map.get("name").toString();
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return "";
    }
}